package org.itboys.pay.demo;

import java.math.BigDecimal;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.itboys.framework.spring.controller.BaseController;
import org.itboys.pay.union.UnionPayBackResult;
import org.itboys.pay.union.UnionPayParam;
import org.itboys.pay.union.UnionPayUtils;
import org.itboys.pay.union.Unionpay;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/** 
 * @author 作者 huml 
 * @version 创建时间：2016-4-6 上午10:17:54 
 * 银联支付demo 
 */
public class CoreUnionPayDemo extends BaseController{

	/**
	 * 银联PC支付
	 * @param request
	 * @param response
	 */
	public void unionPayForPC(HttpServletRequest request, HttpServletResponse response){
		try {
			UnionPayParam upp = new UnionPayParam();
			BigDecimal countFee = BigDecimal.ZERO;
			upp.setOrderNumber("");//订单编号
			upp.setCommodityUrl("");//商品页面地址 可以当做订单详情页面
			upp.setProductName("");//就第一个商品名称 有多个加上 ...
			upp.setProductPrice(countFee);//就填订单总价好了
			upp.setFee(countFee);//订单总价 或者首付金额 看付款类型定
			upp.setIp(request.getRemoteAddr());//客户端IP
			upp.setCustomerName("");//客户姓名 下单人姓名
			upp.setDefaultBankNumber("");//银联编码
			upp.setDefaultPayType("");//支付类型 为网银
			//响应页面
			UnionPayUtils.doResponseUnionPay(response, upp);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	/**
	 * 银联支付成功回调函数(同步+异步)
	 * @param model
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = {"/unionPayReturn","/unionPayNotify"})
	public void unionPayReturn(Model model,HttpServletRequest request,HttpServletResponse response) throws Exception{
		String callbackUrl = request.getRequestURI();//回调地址 判断是同步还是异步通知
		//校验结果
		UnionPayBackResult payBackResult = UnionPayUtils.validateRequest(request);
		String externalId = payBackResult.getOrderNumber();//外部订单ID
		String tradeNo = payBackResult.qId();//银联交易号
		//这个支付成功的话
		if(payBackResult.isSuccess()&& payBackResult.isSignatureCheck()){
			//  TODO  支付成功之后的操作
		}
		
		//到前端去提示是否成功
		model.addAttribute("isVerifySuccess", payBackResult.isSuccess());
				
		if("/order/unionPayReturn".equals(callbackUrl)){//如果是同步回调的话,要给一个支付成功的页面
			response.sendRedirect("/order/success");//创建订单成功页面 因为肯定没选择去其他地方支付的才有这个return值
		}
	}
	
	/**
	 * 银联APP支付
	 */
	public void unionPayForApp(){
		try {
			String orderNo = StringUtils.EMPTY;//订单编号
			Double orderAmount = 0d;//支付金额   单位 元
			String callBackUrl = StringUtils.EMPTY;//回调地址
			String merId = StringUtils.EMPTY;//商户号
			String result = Unionpay.gettn(orderNo, orderAmount, callBackUrl, merId);//支付   返回支付结果SUCCESS/FAIL
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	/**
	 * App支付异步回调
	 * @param request
	 * @param response
	 */
	public void completeOrderUnionpayForApp(
			HttpServletRequest request, HttpServletResponse response) {
		try {
			Map<String,String>valiData=Unionpay.getValiData(request);
			logger.info(valiData.toString());
			if (null!=valiData) {
				// TODO  支付成功之后的处理
				
			}
		} catch (Exception e) {
			logger.error("completeOrderUnionpay error!");
		} 
	}
	
}
